Визуализация
Без ограничения общности, пусть у нас подмножество – численное.
Зададим семейство подмножеств :
Запомним его мощность и проиндексируем подмножества.
Удобнее будет хранить его в виде таблицы связности:
, если -ое подмножество содержит элемент
Реализация в Pyomo
Переменная , если мы берем подмножество в целевое семейство и в противном случае.
Целевая функция — мощность семейства , т.е. сумма по
Единственное ограничение:
То есть
Теперь можно просто заменить существование на сравнение суммы по k с единицей.
Определяем солвер:
StasFomin: Увы, моя вина, что нечетко (хотя однозначно, как в базе Вигго-Кана) сформулировал. Сейчас обновил формулировку, пояснив примером, о чем эта задача — т.е. это как покрытие, но с дополнительными ограничениями на различимость болезней. Увы, тут уже видно, что «9»-я болезнь не покрывается никакими тестами.
Модель в общем случае:
Трансляция к задаче о разрешимости
Если мощность найденного меньше, либо равна, заданного параметра , то задача разрешима. Иначе нет.
Сведение 3SAT к задаче
Пусть нам дана формула Здесь – конъюкция и – булевы литералы, либо их отрицание (например, ).
Пусть в входит p конъюкций и k независимых булевых переменных (не считая их отрицаний).
Строим по 3SAT условие для MNT
Исходное множество значений для задачи Minimum Test Collection(MNT) будет состоять из следующих элементов:
"0" — вспомогательный нулевой элемент, не входит ни в одно подмножество семейства ,
"" — вспомогательный элемент, содержится ровно в одном подмножестве ,
"" — "ядра" булевых переменных,
"" — "ядра" конъюкций (целые) и вспомогательные элементы (дробные).
Строим исходное семейство подмножеств . В него будут входить следующие подмножества:
"черное" — содержит и все положительные числа. ,
"красные" — подмножеств, содержащих ровно 2 элемента: и .
"синие" — подмножеств, половина которых содержит число и (назовем их ), а вторая половина — и (назовем их ).
Утверждение:
Существование решения задачи Minimum Test Collection(MNT) с построенными , и эквивалентно существованию решения 3-SAT: .
Доказательство:
Влево: Пусть набор . Решим MNT с заданными и . Выберем из следующие подмножества:
"черное",
все "красные",
"синие" по следующему правилу: для каждого , если — берем , если — берем
Итого подмножеств выбрано.
Докажем, что такой выбор подмножеств удовлетворяет условию MNT: Покажем, что каждый элемент из ни конфликтует ни с каким другим (т.е. для любой пары есть подмножество из |C'|, содержащее один элемент, но не второй):
Нулевой элемент
: входит в "черное", а "0" — нет,
Отрицательные числа: вы взяли "синее", содержащее , но не "0",
Положительные числа: каждое положительное число входит в "красное", куда не входит "0", "красные" взяли все.
Отрицательные числа: не входят в "черное", куда входит ,
Положительные числа: каждое положительное число входит в "красное", куда не входит , "красные" взяли все.
Отрицательные числа
Другие отрицательные: вы взяли "синее", содержащее единственное отрицательное число: ,
Положительные числа: входят в "черное", куда не входят отрицательные.
Дробные положительные:
Другие дробные: в каждом "красном" ровно одно дробное число, "красные" взяли все.
Целые положительные (не из "красного", в которое входит исходное дробное): берем это "красное".
Целые положительные:
Другие целые положительные: в каждом "красном" ровно одно целое число, "красные" взяли все.
Итак, не разобрана только одна связь: дробные положительные и целые положительные, входящие в одно "красное" подмножество. Пусть в 3SAT-задаче . Тогда, по построению, целое число , помимо 1 "черного" и 1 "красного" подмножества, потенциально входит в 3 "синих": в те, что содержат числа ( и т.д.). При этом, исходная задача разрешима, значит , или , или , значит, по построению "синих", мы выбрали в одно из этих трёх "синих". Таким образом это "синее" подмножество разрешает конфликт между и .
Замечание: если , идея выше не поменяется, в таком случае , или , или и входит в одно из (, или , или ).
Вправо:
Пусть — решение MNT( , , ). Заметим, что исходя из построенного и , чтобы не было конфликтов между элементами :
"Черное" подмножество входит в , иначе конфликт между "0" и ("0" не входит ни в одно, входит только в "черное" ).
Чтобы исключить конфликт между и дробными положительными, а так как каждое дробного положительного входит только в "черное" (что не решает конфликт) и в одно "красное", необходимо внести все "красные" в . Мы уже потратили подмножеств.
Чтобы исключить конфликт между "0" и отрицательными числами, для каждого необходимо взять в либо , либо . При этом нам осталось доступно только подмножеств, значит для каждого надо взять одно и ровно одно: или .
Чтобы устранить конфликт между дробными и целыми положительными, находящимися в одной "красной" (т.е. между и ), для каждого в должно быть хотя бы одно "синее" подмножество, содержащее .
Докажем, что из этих выводов следует, что набор , где является решением исходной 3SAT.
Из (3) следует, что определяется однозначно . Из (4) следует, что хотя бы одно "синее" подмножество, содержащее , лежащее в . Пусть это синее подмножество сформировано вокруг элемента , то есть это , если входит в , либо , если в входит . Таким образом:
То есть для каждой конъюкции из (т.е. для каждого положительного целого элемента) есть хотя бы один элемент (либо ), входящий в эту конъюкцию, значит все конъюкции выполняются, значит — решение .
Визуализируем
Функция, генерирующая рандомную формулу 3-КНФ
Функция, превращающая любую 3-КНФ формулу в экземляр задачи MNT (тройку (S, C, gamma)) по алгоритму, описанному выше.
Пример того, что выдает эта функция.
Проверка выполнимости через ЦЛП и SAT-Solver
Проверка разрешимости 3-КНФ через преобразование к MNT и решение через pyomo-ЦЛП
Проверка разрешимости 3-КНФ через pysat Solver
Проверим что это вообще работает на тривиальных 3-КНФ.
Тест, который генерирует случайных 3-КНФ формул длины до и проверяет, что наш ILP и pysat солвер выдают один и тот же ответ на задачу разрешимости
Теперь просто гоняем тесты
Тест на больших формул:
Много тестов для формулы поменьше:
Судя по результатам, для всех прогнанных тестов задачи были эквивалентны.
Теперь хочется прогнать на совсем больших формулах (и посмотреть, что задачка действительно : с увеличением входа время растет экспоненциально).
Судя по времени выполнения, решение 3SAT задачки через ЦЛП — не лучшая затея.